package cn.edu.wynu.apis.collections.lists;

import cn.edu.wynu.apis.common.CommonFunctions;

import java.util.ArrayList;
import java.util.LinkedList;

public class ListLearn {
    public static void main(String[] args) {
        arrayList();

        linkedList();

        // List的两个实现类:都保证元素顺序,都支持插入,删除,查找,修改操作

        CommonFunctions.timeCost("测试arrayList插入性能", () -> testArrayList()); // 370ms
        CommonFunctions.timeCost("测试linkedList插入性能", () -> testLinkedList()); // 5ms
    }

    private static void linkedList() {
        CommonFunctions.cutBlock("LinkedList");
        // 1.2 LinkedList: 链表实现的列表, 插入删除效率高, 随机访问效率低
        LinkedList list = new LinkedList();
        // 1.2.1 增加元素
        list.add(30);
        list.add(20);
        list.add(10);
        System.out.println("linkedList: " + list);
        // 1.2.2 查找元素
        System.out.println("linkedList的第一个元素: " + list.get(0)); // 20

        // 1.2.3 修改元素
        list.set(0, 31);
        System.out.println("修改后的linkedList: " + list);
        // 1.2.4 删除元素
        list.remove(0);
        System.out.println("删除后的linkedList: " + list);
    }

    private static void arrayList() {
        CommonFunctions.cutBlock("ArrayList");
        // 1. 列表:数组增强版; List是一个接口,有多个实现类,比如ArrayList,LinkedList等
        // 1.1 ArrayList: 数组实现的列表, 随机访问效率高, 插入删除效率低
        ArrayList list = new ArrayList();
        // 1.1.1 增加元素
        list.add(10);
        list.add(20);
        list.add(30);
        System.out.println("list: " + list);
        // 1.1.2 查找元素
        System.out.println("list的第二个元素: " + list.get(1)); // 20
        // 1.1.3 修改元素
        list.set(1, 21);
        System.out.println("修改后的list: " + list);
        // 1.1.4 删除元素
        list.remove(1);
        System.out.println("删除后的list: " + list);
    }

    private static void testArrayList() {
        CommonFunctions.cutBlock("测试arrayList插入性能");
        ArrayList list = new ArrayList();
        list.add(10);
        list.add(20);
        list.add(30);
        for (int i = 0; i < 100000; i++) {
            list.add(2, i);
        }
    }

    private static void testLinkedList() {
        CommonFunctions.cutBlock("测试linkedList插入性能");
        LinkedList list = new LinkedList();
        list.add(10);
        list.add(20);
        list.add(30);
        for (int i = 0; i < 100000; i++) {
            list.add(2, i);
        }
    }
}
